import Vue from 'vue'
import VueRouter from 'vue-router'
Vue.use(VueRouter)
import routes from './routes'
// 引入store
import store from '@/store'
// 需要重写VueRouter.prototype 原型对象身上的push|replace方法
// 先把VueRouter.prototype身上的push|replace方法进行保存一份
let originPush = VueRouter.prototype.push
let originReplace = VueRouter.prototype.replace
// 重写 push | replace
// 第一个参数，告诉原来push方法， 你往哪里跳转(传递哪些参数)
VueRouter.prototype.push = function(location,resolve,reject){
    if(resolve && reject){
        originPush.call(this,location,resolve,reject)
    }else{
        originPush.call(this,location,()=>{},()=>{})
    }
}
VueRouter.prototype.replace = function(location,resolve,reject){
    if(resolve && reject){
        originReplace.call(this,location,resolve,reject)
    }else{
        originPush.call(this,location,()=>{},()=>{})
    }
}

let router = new VueRouter({
    routes,
    // 滚动行为
    scrollBehavior (to, from, savedPosition) {
        return { y: 0 }
    }
})

// 全局守卫：前置守卫（在路由跳转的时候进行判断）
router.beforeEach( async (to,from,next)=>{
    // to: 可以获取到你要跳转到哪个路由的信息
    // from: 可以获取到你从哪个路由来的信息
    // next：放行函数 next()放行    next(path)放行到指定的路由   next(false)
    // 用户登录了，才会有token，未登录一定不会有
    let token = store.state.user.token
    // 用户信息
    let name = store.state.user.userInfo.name
    // 用户登录了
    if(token){
        // 用户登录了就不能去login
        if(to.path=='/login' || to.path=='/register'){
            next('/home')
        }else{
            // 登录了，去的不是login，
            // 如果用户名已有
            if(name){
                next()
            }else{
                // 没有用户信息，派发action让仓库存储用户信息在跳转
                try {
                    // 获取用户信息成功
                    await store.dispatch('getUserInfo')
                    next()
                } catch (error) {
                    // token 失效了 获取不到用户的信息
                    // 清除token
                    await store.dispatch('userLogout')
                    next('/login')
                }
            }
        }
    }else{
        // 用户未登录
        // 未登录不能去交易相关，不能去支付相关，不能去支付中心
        if(to.path.indexOf('/trade')!=-1 || to.path.indexOf('/pay')!= -1 || to.path.indexOf('/center') != -1){
            // 把未登录的时候想去没去的地址存储在query参数中
            next('/login?redirect='+to.path)
        }else{
            next()
        }
    }
})

export default router